Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

309
Vistas
Byte de transferencia de MVC o Web API [] el enfoque más eficiente

Después de lograr una implementación exitosa de ajax POST , cargando objetos modelo e incluso objetos complejos gracias a esta buena publicación , el nuevo objetivo es tener una implementación para escenarios aún un poco más complicados.

He intentado implementar la tarea en cuestión a través de ejemplos de código buscando en Google sin una respuesta concreta y correcta.

El objetivo es tener una transferencia de datos multipropósito (tipo de datos múltiples) del lado del cliente al servidor (sin usar un formulario o HttpRequestBase ) pasando una matriz de bytes sin formato de la manera más eficiente (sé que es posible implementar un nuevo protocolo HTTP/2 o googles Protocol Buffers: formato de intercambio de datos de Google

 [HttpPost] public JsonResult UploadFiles(byte[] parUploadBytearry) { }

preferiblemente un modelo cuyas propiedades sean un byte[]

 [HttpPost] public [JsonResult / ActionResult] Upload(SomeClassWithByteArray parDataModel) { }

La firma de la publicación ajax http:

 Log("AajaxNoPostBack preparing post-> " + targetUrl); $.ajax({ type: 'POST', url: targetUrl, data: mods, contentType: "application/json; charset=utf-8", dataType: "json", success: function for Success.. });

También probé desesperadamente esta solución

 public JsonResult UploadFiles(object parUploadBytearry) { if (parUploadBytearry== null) return null; System.Runtime.Serialization.Formatters.Binary.BinaryFormatter bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); var pathtosSave = System.IO.Path.Combine(Server.MapPath("~/Content/uploaded"), "Test11.png"); using (System.IO.MemoryStream ms = new System.IO.MemoryStream()) { bf.Serialize(ms, parUploadFiles); var Barr = ms.ToArray(); var s = new System.Web.Utils.FileFromBar(pathtosSave, BR); } }

como publicó y recibió datos hasta guardar los datos ( .png ) con éxito en un archivo en el sistema, los datos no eran legítimos.

Y el último intento sensato antes del intento de objeto a matriz de bytes fue este ejemplo de código msdn 1

¿Cuál es la forma correcta de pasar una matriz de bytes que C# entenderá?

(en el caso de documentos raw byte[] o archivos como imágenes png )

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

¿Cuál es la forma correcta de pasar una matriz de bytes?

La forma más sencilla de leer un byte[] de WebAPI sin escribir MediaTypeFormatter personalizado para "aplicación/flujo de octetos" es simplemente leerlo manualmente desde el flujo de solicitud:

 [HttpPost] public async Task<JsonResult> UploadFiles() { byte[] bytes = await Request.Content.ReadAsByteArrayAsync(); }

En otra publicación , describí cómo utilizar el formateador incorporado para BSON (JSON binario) que existe en WebAPI 2.1.

Si desea leer y escribir un BinaryMediaTypeFormatter que responda "aplicación/flujo de octetos", una implementación ingenua se vería así:

 public class BinaryMediaTypeFormatter : MediaTypeFormatter { private static readonly Type supportedType = typeof(byte[]); public BinaryMediaTypeFormatter() { SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/octet-stream")); } public override bool CanReadType(Type type) { return type == supportedType; } public override bool CanWriteType(Type type) { return type == supportedType; } public override async Task<object> ReadFromStreamAsync(Type type, Stream stream, HttpContent content, IFormatterLogger formatterLogger) { using (var memoryStream = new MemoryStream()) { await stream.CopyToAsync(memoryStream); return memoryStream.ToArray(); } } public override Task WriteToStreamAsync(Type type, object value, Stream stream, HttpContent content, TransportContext transportContext) { if (value == null) throw new ArgumentNullException("value"); if (!type.IsSerializable) throw new SerializationException( $"Type {type} is not marked as serializable"); var binaryFormatter = new BinaryFormatter(); binaryFormatter.Serialize(stream, value); return Task.FromResult(true); } }
over 4 years ago · Santiago Trujillo Denunciar

0

La respuesta es verdadera, pero estoy usando asp.net mvc en Visual Studio 2019 y parece que no hay ninguna definición para Request.Content , y este es el error:

'HttpRequest' no contiene una definición para 'Contenido' y no se pudo encontrar ningún método de extensión accesible 'Contenido' que acepte un primer argumento del tipo 'HttpRequest'.

Luego utilicé este enfoque y funciona para mí:

 Request.InputStream.Position = 0; List<byte> bytelist = new List<byte> { }; while (Request.InputStream.Position != Request.InputStream.Length) { bytelist.Add((byte)Request.InputStream.ReadByte()); }

Espero que sea útil والله اعلم

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda